const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin') // 将定义的其他规则复用到.Vue文件相应的语言的块，例如js规则也会应用到.vue文件的<script>标签内的js函数
const CopyWebpackPlugin = require('copy-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const isDev = process.env.NODE_ENV === 'development'

module.exports = {
    entry: './src/main.js',
    output: {
        filename: '[name]-[hash:8].bundle.js',
        path: path.join(__dirname, '/dist')
    },
    module: {
        rules: [
            {
                test: /\.(vue|js)$/,
                exclude: /node_modules/,
                loader: 'eslint-loader',
                enforce: 'pre' // 预处理
            },
            {
                test: /\.vue$/,
                loader: 'vue-loader', // vue-template-compiler是vue-loader默认调用的模板编译器
            },
            {
                test: /\.js$/,
                exclude: file => ( // 确保js的转义应用到node_modules中的vue组件
                    /node_modules/.test(file) &&
                    !/\.vue\.js/.test(file)
                  ), 
                loader: 'babel-loader'
            },
            {
                test: /\.css$/,
                use: [ // use列表里loader是从后往前执行，所以最新执行的loader要放在最后面，如下css-loader
                    isDev ? 'style-loader': MiniCssExtractPlugin.loader,
                        'css-loader'
                ]
            }, {
                test: /\.less$/,
                use: [ // use列表里loader是从后往前执行，所以最新执行的loader要放在最后面，如下css-loader
                    isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
                    'css-loader',
                    'less-loader'
                ]
            }, {
                test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,  // 小文件转换成字符串， 使用Data URLs, 减少请求次数，大文件单独提取存放，提高加载速度
                use: {
                    loader: 'url-loader',  // 安装url-loader时，同时也需要安装file-loader,当前url-loader面对超过10kb的文件会自动去加载file-loader
                    options: {
                        limit: 10 * 1024, // 10 kb
                        esModule: false,
                        name: '[name].[ext]'
                    }
                }
            },
            {
                test: /\.(svg)(\?.*)?$/,
                use: [
                    /* config.module.rule('svg').use('file-loader') */
                    {
                        loader: 'file-loader',
                        options: {
                            esModule: false,
                            name: '[name].[ext]'
                        }
                    }
                ]
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            esModule: false,
                            name: '[name].[ext]'
                        }
                    }
                ]
            }
        ]
    },
    plugins: [ // 插件数组的位置顺序和插件的使用有关联吗
        new VueLoaderPlugin(),
        new webpack.DefinePlugin({
            BASE_URL: '"./"',
            'process.env': {
                NODE_ENV: isDev ? '"development"' : '"production"',
              },
        }),
        new CopyWebpackPlugin({
            patterns: [
                {
                    from: 'public',
                },
            ],
        }),
        new HtmlWebpackPlugin({
            title: 'my vue app',
            meta: {
                viewport: 'width=device-width'
            },
            template: './public/index.html'
        })
    ],
    resolve: {
        extensions: [".js", ".vue", ".json",], // 直接使用 import xx from 'xx' 的语法
        alias: {
            vue$: "vue/dist/vue.esm.js",
            "@": path.resolve(__dirname, "../src"),
            "@src": path.resolve(__dirname, "../src/assets")
        }
    }
}